package com.lins.store.config.interceptor;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义的登录拦截器配置
 * 其实是对spring mvc配置接口的实现，以个性化设置一些东西
 * @Author: linshuo
 * @Date: 2022/9/28 14:29
 **/

//继承@Configuration，功能一致：将当前类内声明的Bean实例纳入到spring容器中，并且方法名就是实例名，唯一区别是允许自动找到配置。
@SpringBootConfiguration
public class LoginInterceptorConfig implements WebMvcConfigurer,HandlerInterceptor{

    /**
     * 拦截器解决跨域问题，重写方法，以设置允许的访问。
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //添加映射路径
        registry.addMapping("/**")
                //允许的域
                //.allowedOrigins("*")
                .allowedOriginPatterns("*")
                //允许携带cookie
                .allowCredentials(true)
                //允许的请求方式
                //.allowedMethods("GET","POST","DELETE","PUT")
                .allowedMethods("GET","POST","DELETE","PUT","HEAD","OPTIONS")
                .exposedHeaders("*")
                //允许的请求头
                .allowedHeaders("*")
                //有效期3600秒之内，浏览器可以不用再询问
                .maxAge(3600);
    }

    /**
     * 在拦截器配置里，添加登录拦截器
     * 重写 WebMvcConfigurer的addInterceptors方法，将自定义的拦截器注册到整个服务
     * 除了排除的url，其余都被捕捉到，执行自定义的拦截器内部的设置
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 创建自定义的拦截器对象(多态形式)
        HandlerInterceptor interceptor = new LoginInterceptor();
        // list白名单作为放行参数,不登录也可访问
        List<String> patterns = new ArrayList<>();
        //也可以使用String[] 但源码也会转为List<String> patterns
        patterns.add("/bootstrap3/**");
        patterns.add("/css/**");
        patterns.add("/js/**");
        patterns.add("/images/**");

        patterns.add("/index.html");
        patterns.add("/web/register.html");
        patterns.add("/web/login.html");
        patterns.add("/swagger-ui.html");

        patterns.add("/login/reg");
        patterns.add("/login/login");
        patterns.add("/login/getImage");

        patterns.add("/websocket/**");
        patterns.add("/utils/**");
        patterns.add("/demo/**");
        patterns.add("/msm/**");
        patterns.add("/http/getIp");

        patterns.add("/mood/**");

        patterns.add("/wx/**");

        //在webapp的文件被编译到classpath:/META-INF/resources/
        patterns.add("/META-INF/resources*");
        // 通过注册工具添加拦截器               要拦截的url：项目下所有请求  除了(list)
        registry.addInterceptor(interceptor).addPathPatterns("/**").excludePathPatterns(patterns);
    }
}
